package cn.swust.designpatternlearningplatform.listener;

import cn.swust.designpatternlearningplatform.common.exception.CustomException;
import cn.swust.designpatternlearningplatform.domain.enums.TopicTypeEnum;
import cn.swust.designpatternlearningplatform.domain.vo.TopicExcelVo;
import cn.swust.designpatternlearningplatform.domain.vo.TopicOptionVo;
import cn.swust.designpatternlearningplatform.domain.vo.TopicVo;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * 题目表格读取监听器
 *
 * @author Tang
 * @date 2023/5/24 12:54
 **/
@Slf4j
public class TopicExcelDataListener implements ReadListener<TopicExcelVo> {

    /**
     * 缓存的数据
     */
    private final List<TopicExcelVo> cachedDataList = new ArrayList<>();
    @Getter
    private final List<TopicVo> right = new ArrayList<>();
    private final List<Integer> error = new ArrayList<>();
    /**
     * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */


    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public TopicExcelDataListener() {
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(TopicExcelVo data, AnalysisContext context) {
        cachedDataList.add(data);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        handleData();
        log.info("所有数据解析完成！");
    }

    /**
     * 加上存储数据库
     */
    private void handleData() {
        for (int i = 0; i < cachedDataList.size(); i++) {
            TopicVo topicVo = cachedDataList.get(i).parse();
            if (check(topicVo)) {
                right.add(topicVo);
            } else {
                error.add(i + 2);
            }
        }
        if (error.size() != 0) {
            throw new CustomException(error.toString());
        }
    }

    /**
     * 校验选择题是否解析正确
     *
     * @param topicVo
     * @return boolean
     * @author Tang
     * @date 2023/5/25 16:06
     **/
    private boolean check(TopicVo topicVo) {
        //选择题检验
        if (topicVo.getTopicType().equals(TopicTypeEnum.SINGLE.typeId) ||
                topicVo.getTopicType().equals(TopicTypeEnum.MULTIPLE.typeId)) {
            List<TopicOptionVo> topicOptionVos = topicVo.getTopicOptionVos();
            if (topicOptionVos.size() != 0) {
                for (TopicOptionVo topicOptionVo : topicOptionVos) {
                    if (topicOptionVo.getOptionContent().contains("\n")) {
                        return false;
                    }
                }
                return true;
            } else {
                return false;
            }
        }
        return true;
    }
}
